home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 145 / Gekkan Dennou Club - 2000.6 Vol. 145 (Japan).7z / Gekkan Dennou Club - 2000.6 Vol. 145 (Japan) (Track 1).bin / tools / sharp / sxwork3.lzh / サンプル実用編 / チャート / CHART.C next >
Text File  |  1994-03-10  |  9KB  |  322 lines

  1. /******************************************************************************
  2.  *    chart.c:    チャートの処理関数
  3.  ******************************************************************************
  4.  *    Workroom SX-68K Sample Program Copyright 1994 SHARP
  5.  */
  6. #include <stdio.h>
  7. #include <string.h>
  8. #include <time.h>
  9. #include <sxgraph.h>        /* グラフ系マネージャを利用するときに必要 */
  10. #include <dialog.h>        /* ダイアログマンを利用するときに必要    */
  11. #include <task.h>        /* タスクマンを利用するときに必要    */
  12. #include "chart.h"        /* このプログラム固有のヘッダファイル    */
  13. #include "csfile.h"        /* 小遣い帳データファイルのヘッダファイル */
  14.  
  15. /******************************************************************************
  16.  *    opening():    データファイルの存在を確認する
  17.  ******************************************************************************
  18.  *    引数:    ComVal *pcv    共通変数へのポインタ
  19.  *    戻り値:    BOOLEAN        = TRUE:  存在する
  20.  *                = FALSE: 存在しない
  21.  */
  22. BOOLEAN opening(ComVal *pcv)
  23. {
  24.     int errCode;
  25.     char *fep;
  26.     char pathName[128];
  27.     Task task;            /* タスク管理レコード        */
  28.  
  29.     TSGetTdb(&task, TS_OWN);    /* タスク管理レコードを取得する    */
  30.     strcpy(pathName, task.name);
  31.     /* フルパス名よりファイル名の先頭を求める */
  32.     SXSearchFname(pathName, &fep);
  33.     fep[0] = 0;
  34.     /* データファイルをサーチ */
  35.     errCode = TSSearchFile(DATA_FNODE DATA_FEXT, pcv->fileName, pathName);
  36.     if (errCode < 0) {
  37.         /* データファイルが見付からない場合 */
  38.         DMError(D_CONFIRM, "データファイルが見付かりません。");
  39.         return FALSE;
  40.     }
  41.     return TRUE;
  42. }
  43.  
  44. /******************************************************************************
  45.  *    getMaxDay():    指定月の全日数を返す
  46.  ******************************************************************************
  47.  *    引数:    int month    指定の月
  48.  *    戻り値:    int days    日数
  49.  *    注釈:    月の値が1~12でないときは0を返します。
  50.  */
  51. int getMaxDay(int month)
  52. {
  53.     int days = 0;
  54.  
  55.     switch (month) {
  56.     case 1:                /* 31日まである月    */
  57.     case 3:
  58.     case 5:
  59.     case 7:
  60.     case 8:
  61.     case 10:
  62.     case 12:
  63.         days = 31;
  64.         break;
  65.     case 4:                /* 30日まである月    */
  66.     case 6:
  67.     case 9:
  68.     case 11:
  69.         days = 30;
  70.         break;
  71.     case 2:                /* 2月は28日まで閏年は無視    */
  72.         days = 28;
  73.         break;
  74.     }
  75.     return days;
  76. }
  77.  
  78. /******************************************************************************
  79.  *    lastMonth():    入力の月の1月前の月を返す
  80.  ******************************************************************************
  81.  *    引数:    int mon        指定の月
  82.  *    戻り値:    int        1ヶ月前の月
  83.  */
  84. int lastMonth(int mon)
  85. {
  86.     /* 1引く */
  87.     mon--;
  88.  
  89.     /* 0以下になったら12たす */
  90.     if (mon < 1)
  91.         mon += 12;
  92.  
  93.     return mon;
  94. }
  95.  
  96. /******************************************************************************
  97.  *    getDate():    月日をシステムから取得する
  98.  ******************************************************************************
  99.  *    引数:    int *month    月を格納するポインタ
  100.  *        int *day    日を格納するポインタ
  101.  */
  102. void getDate(int *month, int *day)
  103. {
  104.     time_t gdate;            /* 標準時間からの経過時間    */
  105.     struct tm *date;        /* tm構造体へのポインタ        */
  106.  
  107.     /* OSから現在の日時を取得する */
  108.     gdate = time(NULL);
  109.     date = gmtime(&gdate);
  110.  
  111.     /* 今日の日付 */
  112.     *month = date->tm_mon + 1;
  113.     *day = date->tm_mday;
  114. }
  115.  
  116. /******************************************************************************
  117.  *    drawTextArea():    テキスト表示部分のバックグラウンドの描画
  118.  ******************************************************************************
  119.  *    引数:    ComVal *pcv    共通変数へのポインタ
  120.  */
  121. void drawTextArea(ComVal *pcv)
  122. {
  123.     int oldfc, oldbc, oldpm;
  124.     Region **rgnHdl;
  125.  
  126.     /* テキストモードに設定する */
  127.     setGraph(pcv, G_TXT);
  128.  
  129.     /* レクタングルの描画 */
  130.     rgnHdl = GMNewRgn();
  131.     if (rgnHdl == NULL) {
  132.         DMError(D_CONFIRM, "メモリが確保できません。");
  133.         return;
  134.     }
  135.  
  136.     /* 描画属性 */
  137.     oldfc = GMForeColor(G_LGRAY);
  138.     oldbc = GMBackColor(G_THRU);
  139.     oldpm = GMPenMode(G_PSET);
  140.  
  141.     GMRectRgn(rgnHdl, &pcv->windowPtr->graph.rect);
  142.     GMDiffRectRgn(rgnHdl, rgnHdl, &rcGraph);
  143.     GMFillRgn(rgnHdl);
  144.     GMDisposeRgn(rgnHdl);        /* リージョンハンドルを解放する    */
  145.     GMShadowRect(&rcGraph);
  146.  
  147.     /* 描画属性を元に戻す */
  148.     GMForeColor(oldfc);
  149.     GMBackColor(oldbc);
  150.     GMPenMode(oldpm);
  151. }
  152.  
  153. /******************************************************************************
  154.  *    clearDisp():    画面の消去
  155.  ******************************************************************************
  156.  *    引数:    ComVal *pcv    共通変数へのポインタ
  157.  */
  158. void clearDisp(ComVal *pcv)
  159. {
  160.     int oldpm, oldfc;        /* デフォルトのペンモード    */
  161.  
  162.     oldpm = GMPenMode(G_PSET);
  163.     oldfc = GMForeColor(GC_WHITE);
  164.     GMFillRect(&rcGraph);
  165.     /* 描画属性をデフォルトの値にする */
  166.     GMPenMode(oldpm);
  167.     GMForeColor(oldpm);
  168. }
  169.  
  170. /******************************************************************************
  171.  *    readData():    全データを読み込む
  172.  ******************************************************************************
  173.  *    引数:    ComVal *pcv    共通変数へのポインタ
  174.  *    戻り値:    BOOLEAN        = TRUE:  読み込み成功
  175.  *                = FALSE: 読み込み失敗
  176.  */
  177. BOOLEAN readData(ComVal *pcv)
  178. {
  179.     int i, j;
  180.  
  181.     /* データ格納領域をクリアする */
  182.     for (i = 0; i < 12; i++)
  183.         for (j = 0; j < 7; j++)
  184.             pcv->money[i][j] = 0;
  185.  
  186.     /* 各月の合計を配列に登録する */
  187.     for (i = 1; i < 13; i++)
  188.         if (!sumMonth(pcv, i, pcv->money[i - 1], &pcv->sum[i - 1]))
  189.             return FALSE;
  190.  
  191.     return TRUE;
  192. }
  193.  
  194. /******************************************************************************
  195.  *    sumMonth():    ひと月のデータの合計を取得する
  196.  ******************************************************************************
  197.  *    引数:    ComVal *pcv    共通変数へのポインタ
  198.  *        int month    月
  199.  *        int *tMoney    金額格納バッファへのポインタ
  200.  *        int *sum    合計の金額を格納するポインタ
  201.  *    戻り値:    BOOLEAN        = TRUE:  合計の計算に成功
  202.  *                = FALSE: 合計の計算ができなかった
  203.  */
  204. BOOLEAN sumMonth(ComVal *pcv, int month, int *tMoney, int *sum)
  205. {
  206.     int i, max, day;
  207.     BOOLEAN ret = TRUE;
  208.     short index[512];
  209.     KZDATA kzbuff;            /* データバッファ    */
  210.  
  211.     /* データをクリアする */
  212.     *sum = 0;
  213.     for (i = 0; i < 7; i++)
  214.         tMoney[i] = 0;
  215.  
  216.     /* データ位置テーブルを読み込む */
  217.     if (!readTable(pcv, index))
  218.         /* データ位置テーブルが読み込めなかった */
  219.         return FALSE;
  220.  
  221.     /* ループ数を求める */
  222.     max = getMaxDay(month);
  223.  
  224.     /* 1月分データの合計を求める */
  225.     for (day = 1; day <= max; day++) {
  226.         if (index[(month - 1) * 32 + (day - 1)] != -1) {
  227.             /* データが存在した場合だけディスクからロード */
  228.             ret = loadFile(pcv, month, day, &kzbuff.money[0]);
  229.             if (!ret)
  230.                 /* 読み込みエラー発生 */
  231.                 break;
  232.             /* 項目ごとにデータを加算 */
  233.             for (i = 0; i < 7; i++)
  234.                 tMoney[i] += kzbuff.money[i];
  235.         }
  236.     }
  237.     /* 合計を計算 */
  238.     for (i = 0; i < 7; i++)
  239.         *sum += tMoney[i];
  240.  
  241.     return ret;
  242. }
  243.  
  244. /******************************************************************************
  245.  *    drawStrM():    指定座標を中心に文字列を描画する
  246.  ******************************************************************************
  247.  *    引数:    char *pstr    表示文字列
  248.  *        LPoint lpt    ペン位置
  249.  *
  250.  */
  251. void drawStrM(char *pstr, LPoint lpt)
  252. {
  253.     Point pt;
  254.  
  255.     pt.x_y = lpt;
  256.     pt.p.x -= LOWWORD(GMStrWidth(pstr, 0, (int) strlen(pstr))) / 2;
  257.     pt.p.y -= LOWWORD(GMFontInfo()) / 2;
  258.     drawStrZ(pstr, pt.x_y);        /* 文字列を描画する    */
  259. }
  260.  
  261. /******************************************************************************
  262.  *    drawStrZ():    指定の位置への文字列の描画
  263.  ******************************************************************************
  264.  *    引数:    char *pstr    表示文字列
  265.  *        LPoint lpt    ペン位置
  266.  */
  267. void drawStrZ(char *pstr, LPoint lpt)
  268. {
  269.     GMMove(lpt);            /* ペンを指定の位置へ移動する    */
  270.     GMDrawStrZ(pstr);        /* 文字列を描画する        */
  271. }
  272.  
  273. /******************************************************************************
  274.  *    changeData():    データ変更の手続きをする
  275.  ******************************************************************************
  276.  *    引数:    ComVal *pcv    共通変数へのポインタ
  277.  *    注釈:
  278.  *    小遣い帳.Xよりデータファイルの変更の通知を受けグラフの表示を変更
  279.  */
  280. void changeData(ComVal *pcv)
  281. {
  282.     int tmonth;
  283.     int mon1, mon2, mon3;        /* 現在の1、2、3ヶ月前の月    */
  284.     BOOLEAN drawFlag = FALSE;
  285.  
  286.     /* 変更月の合計を再計算 */
  287.     tmonth = pcv->event.ts.whom;
  288.     sumMonth(pcv, tmonth, pcv->money[tmonth - 1], &pcv->sum[tmonth - 1]);
  289.     /* 現在の状態により振り分ける */
  290.     switch (pcv->kind) {
  291.     case GK_CRCL:            /* 円グラフのとき    */
  292.         /* 合計が0であればデータなしと判断 */
  293.         if (pcv->sum[tmonth - 1] == 0) {
  294.             /* メッセージ表示 */
  295.             DMError(D_CONFIRM, "当月データがありません。");
  296.             /* フラグを初期状態に戻す */
  297.             pcv->kind = GK_INIT;
  298.             drawFlag = TRUE;
  299.             break;
  300.         }
  301.         /* この処理は下に続きます */
  302.     case GK_RADAR:            /* レーダーチャートのとき    */
  303.         /* 再描画の必要がある場合のみ再描画 */
  304.         if (pcv->month == tmonth)
  305.             drawFlag = TRUE;
  306.         break;
  307.     case GK_BAR:            /* 棒グラフのとき    */
  308.     case GK_LINE:            /* 折れ線グラフのとき    */
  309.         /* 1、2、3ヶ月前の月の取得 */
  310.         mon1 = lastMonth(pcv->month);
  311.         mon2 = lastMonth(mon1);
  312.         mon3 = lastMonth(mon2);
  313.         /* 合計値の変更 */
  314.         /* 再描画の必要がある場合のみ再描画 */
  315.         if (tmonth == pcv->month || tmonth == mon1 || tmonth == mon2 || tmonth == mon3)
  316.             drawFlag = TRUE;
  317.         break;
  318.     }
  319.     if (drawFlag)
  320.         addUpdate(pcv->windowPtr, &rcGraph); /* 描画する    */
  321. }
  322.